package com.smdp.controller;


import com.smdp.dto.Result;
import com.smdp.entity.Blog;
import com.smdp.service.IBlogService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * 博客前端控制器。
 * 包含发博客（审核后正式发布）、更新博客（审核后正式更新）、为博客点赞、查询（自己的、根据用户id、热门、根据博客id）博客、删除博客。
 *
 * @author 蔡方珩
 */
@RestController
@RequestMapping("/blog")
public class BlogController {

    @Resource
    private IBlogService blogService;

    /**
     * 发博客，将博客推送到MQ等待审核，审核通过后发布。
     * @param blog 博客对象
     * @return ok
     */
    @PostMapping("/save")
    public Result saveBlog(@RequestBody Blog blog) throws Exception {
        return blogService.saveBlog(blog);
    }

    /**
     * 点赞博客。
     * 如果用户已经点赞则取消点赞。
     * @param id 博客id
     * @return ok
     */
    @PutMapping("/like/{id}")
    public Result likeBlog(@PathVariable("id") Long id) {
        // 修改点赞数量
        return blogService.likeBlog(id);
    }

    /**
     * 查询我的博客
     * @param current 当前页数
     * @return 分页的我的博客
     */
    @GetMapping("/of/me")
    public Result queryMyBlog(@RequestParam(value = "current", defaultValue = "1") Integer current) {
        return blogService.queryMyBlog(current);
    }

    /**
     * 根据用户id查询博客
     * @param current 当前页数
     * @param userId 用户id
     * @return 分页的用户博客
     */
    @GetMapping("/of/user")
    public Result queryBlogByUserId(
            @RequestParam(value = "current", defaultValue = "1") Integer current,
            @RequestParam("id") Long userId) {
        return blogService.queryBlogByUserId(current, userId);
    }

    /**
     * 查询热门博客（按点赞数排序）
     * @param current 当前页数
     * @return 成功：分页热门博客
     */
    @GetMapping("/hot")
    public Result queryHotBlog(@RequestParam(value = "current", defaultValue = "1") Integer current) {
        return blogService.queryHotBlog(current);
    }

    /**
     * 根据博客id查询博客
     * @param id 博客id
     * @return 成功：博客 / 失败：失败原因
     */
    @GetMapping("/{id}")
    public Result queryBlogById(@PathVariable("id") Long id) {
        return blogService.queryBlogById(id);
    }

    /**
     * 查询最先点赞博客的5名用户
     * @param id 博客id
     * @return 成功：先点赞博客的5名用户的列表 / 失败：空白列表
     */
    @GetMapping("/likes/{id}")
    public Result queryBlogLikes(@PathVariable("id") Long id) {
        return blogService.queryBlogLikes(id);
    }

    /**
     * 查询“我的关注”博主发的博客
     * @param lastId    上次查询的最小时间戳，即本轮查询的、第一条博客的时间戳，是查询的原点
     * @param offset    偏移量，时间戳为lastId、且已查询过的博客数量，也即需要跳过的博客数量
     * @return 成功：ScrollResult，储存Blog、minTime、offset / 失败：失败原因
     */
    @GetMapping("/of/follow")
    public Result queryBlogOfFollow(
            @RequestParam("lastId") Long lastId,
            @RequestParam(value = "offset", defaultValue = "0") Integer offset) {
        return blogService.queryBlogOfFollow(lastId, offset);
    }

    /**
     * 根据id删除博客
     * @param blogId 博客id
     * @return 成功：blogId / 失败：失败原因
     */
    @DeleteMapping("/delete/{id}")
    public Result deleteBlogById(@PathVariable("id") Long blogId){
        return blogService.deleteBlogById(blogId);
    }

    /**
     * 更新博客，将博客推送到MQ等待审核，审核通过后更新。
     * @param blog 博客对象
     * @return ok
     */
    @PutMapping("/update")
    public Result updateBlogById(@RequestBody Blog blog) throws Exception {
        return blogService.updateBlog(blog);
    }
}
